package com.tanhua.server.service;

import com.tanhua.commons.key.RedisKeyConst;
import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mg.Comment;
import com.tanhua.domain.mg.Publish;
import com.tanhua.domain.mg.Video;
import com.tanhua.domain.vo.SingleCommentVo;
import com.tanhua.dubbo.api.PublishApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.mg.CommentApi;
import com.tanhua.dubbo.mg.VideoApi;
import com.tanhua.server.utils.RelativeDateFormat;
import com.tanhua.server.utils.ThreadLocalUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.bson.types.ObjectId;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class CommentService {
    //订阅PublishApi
    @Reference
    private PublishApi publishApi;
    //订阅videoApi
    @Reference
    private VideoApi videoApi;
    //订阅UserInfoApi
    @Reference
    private UserInfoApi userInfoApi;

    //订阅CommentAPi
    @Reference
    private CommentApi commentApi;
    //注入ThreadLocalUtils对象
    @Autowired
    private ThreadLocalUtils threadLocalUtils;
    //注入redisTemplate对象
    @Autowired
    private RedisTemplate<String,String> redisTemplate;


    /**
     * 动态-点赞
     * 评论类型 1点赞 2评论 3喜欢
     * 评论内容类型 1对动态操作 2对视频操作 3对评论操作
     */
    public Integer likeCount(String id) {
        Comment comment = packageComment(1,id, 1,1);
        //调用commentApi方法 传入id 返回long类型的点赞数量C
        Integer likeCount=commentApi.save(comment);
        //用户看到的点赞状态也要设置
        //设置一个key
        String key= RedisKeyConst.LIKE_STATUS+threadLocalUtils.getUserId()+"_"+comment.getPublishId();
        //存入redis
        redisTemplate.opsForValue().set(key,"like_status");
        //返回点赞数量
        return likeCount;
    }

    /**
     * 动态-取消点赞
     */
    public Integer removeLikeStatus(String id) {
        //调用公共方法
        Comment comment = packageComment(0, id, 1, 1);
        //调用commentApi方法 传入id 返回long类型的点赞数量
        Integer likecount=commentApi.remove(comment);
        //用户看到的点赞状态也要设置
        //设置一个key
        String key= RedisKeyConst.LIKE_STATUS+threadLocalUtils.getUserId()+"_"+comment.getPublishId();
        //存入redis
        redisTemplate.delete(key);
        //返回点赞数量
        return likecount;
    }

    /**
     * 动态-喜欢
     */
    public Integer loveCount(String id) {
        //调用公共方法
        Comment comment = packageComment(1,id, 1,3);
        //调用commentApi方法 传入id 返回long类型的喜欢数量
        Integer loveCount=commentApi.save(comment);
        //用户看到的喜欢状态也要设置
        //设置一个key
        String key= RedisKeyConst.LOVE_STATUS+threadLocalUtils.getUserId()+"_"+comment.getPublishId();
        //存入redis
        redisTemplate.opsForValue().set(key,"love_status");
        //返回喜欢数量
        return loveCount;
    }
    /**
     * 动态-取消喜欢
     */
    public Integer removeLoveStatus(String id) {
        Comment comment = packageComment(0, id, 1, 3);
        //调用commentApi方法 传入id 返回long类型的喜欢数量
        Integer loveCount=commentApi.remove(comment);
        //用户看到的喜欢状态也要设置
        //设置一个key
        String key= RedisKeyConst.LOVE_STATUS+threadLocalUtils.getUserId()+"_"+comment.getPublishId();
        //存入redis
        redisTemplate.delete(key);
        //返回点赞数量
        return loveCount;
    }
    /**
     * 单条动态
     * @param id
     * @return
     */
    public SingleCommentVo findSingleComment(String id) {
        //3.1调用方法 传入发布id 返回查询到的发布信息
        Publish publish = publishApi.findPublishById(id);
        //3.2根据发布信息 获取用户id
        Long userId = publish.getUserId();
        //3.3根据用户id 查询userinfo表 查询到详细的信息
        UserInfo userInfo = userInfoApi.findUserInfoByID(userId);
        //3.2封装数据 返回
        SingleCommentVo singleCommentVo = new SingleCommentVo();
        //3.3复制UserInfo和Publish的属性到SingleCommentVo对象
        BeanUtils.copyProperties(publish,singleCommentVo);
        BeanUtils.copyProperties(userInfo,singleCommentVo);
        //3.4单独赋值
        singleCommentVo.setId(id);//动态id
        if(userInfo.getTags()!=null){
            singleCommentVo.setTags(userInfo.getTags().split(","));
        }//标签
        singleCommentVo.setImageContent(publish.getMedias().toArray(new String[]{}));//图片地址
        singleCommentVo.setCreateDate(RelativeDateFormat.format(new Date(publish.getCreated())));//转换时间
//        singleCommentVo.setHasLiked(0);  //是否点赞  0：未点 1:点赞
////        singleCommentVo.setHasLoved(0);  //是否喜欢  0：未点 1:点赞
        singleCommentVo.setDistance("100米");//距离
        singleCommentVo.setUserId(userInfo.getId().intValue());
        return singleCommentVo;
    }


    /**
     * 调用这个方法 传入视频或者动态的id 根据评论类型和评论内容设置对应的评论对象
     * @param operatingType 当前执行（1）点赞/喜欢 还是取消（0）点赞/喜欢
     * @param publishOrVideoIdOrCommendPrimary 动态或者视频的id或者评论主键id
     * @param commentTypeNum 评论类型：点赞 评论 喜欢
     * @param pubTypeNum 评论内容类型：动态 视频 评论
     * @return 传入参数 封装Commend对象
     */
     Comment packageComment(Integer operatingType,String publishOrVideoIdOrCommendPrimary, int pubTypeNum,int commentTypeNum) {
        //创建comment对象
        Comment comment = new Comment();
        Long userId = threadLocalUtils.getUserId();
        //设置当前评论的用户id
        comment.setUserId(userId);
        //设置发布id
        comment.setPublishId(new ObjectId(publishOrVideoIdOrCommendPrimary));
        //设置评论的类型 1对动态进行操作
        comment.setPubType(pubTypeNum);
        //设置评论内容的类型 1 点赞操作
        comment.setCommentType(commentTypeNum);
        //判断当前是点赞还是取消点赞的操作
        if(operatingType==1){
            //根据评论内容类型 或者评论类型设置对应的PUblishUserId值
            if (comment.getPubType()==1) {//对动态的操作 给评论表冗余一个发布作者字段
                Publish publish = publishApi.findPublishById(new ObjectId(publishOrVideoIdOrCommendPrimary).toString());
                comment.setPublishUserId(publish.getUserId());
            }
            else if(comment.getPubType()==2){//对视频的操作 给评论表冗余一个发布作者字段
                Video video = videoApi.findVideoById(publishOrVideoIdOrCommendPrimary);
                comment.setPublishUserId(video.getUserId());
            }
            else {
                //对评论的操作 给评论表冗余一个评论人id
                Comment queryCommentById = commentApi.queryCommentById(publishOrVideoIdOrCommendPrimary);
                comment.setPublishUserId(queryCommentById.getUserId());
            }
        }
        return comment;
    }
    /**
     * 视频-点赞
     */
    public Integer videoLikeCount(String videoId) {
        //调用公共方法
        Comment comment = packageComment(1,videoId, 2,1);
        //调用commentApi方法 传入id 返回long类型的喜欢数量
        Integer videoLikeCount=commentApi.save(comment);
        //用户看到的视频喜欢状态也要设置
        //设置一个key
        String key= RedisKeyConst.VIDEO_LIKE_STATE+threadLocalUtils.getUserId()+"_"+comment.getPublishId();
        //存入redis
        redisTemplate.opsForValue().set(key,"videoLike_state");
        //返回喜欢数量
        return videoLikeCount;
    }

    /**
     * 视频-取消点赞
     */
    public Integer videoDisLive(String videoId) {
        //调用公共方法
        Comment comment = packageComment(0,videoId, 2,1);
        //调用commentApi方法 传入id 返回long类型的喜欢数量
        Integer videoLikeCount=commentApi.remove(comment);
        //用户看到的视频喜欢状态也要设置！
        //设置一个key
        String key= RedisKeyConst.VIDEO_LIKE_STATE+threadLocalUtils.getUserId()+"_"+comment.getPublishId();
        //存入redis
        redisTemplate.delete(key);
        //返回点赞数量
        return videoLikeCount;
    }
}
